\chapter{Récupération des informations de lieu}
\paragraph{}
Un des points important du sujet est la récupérations de points d'intérêts. Pour ce faire il nous fallait utiliser des services en ligne, mais quel service ?

\section*{Quelle API choisir ?}
\paragraph{} 
Dans un premier temps, nous avions opter pour une solution se dissociant de Google, OpenStreetMap. Après quelques recherches infructueuses de librairies ou d'explications claires, l'équipe décida de migrer vers une API déjà connu de certains membres, \textbf{Google API}.
\paragraph{}
OpenStreetMap est assez peu documenté sur le web : la page Wikipedia ne permet pas de savoir comment peuvent etre interrogées les données d'une carte. Nous avons compris que les données sont enregistrées en XML, avec un format spécifique, mais cette structure n'est pas définie clairement. Cela signifie que si nous voulions charger des résultats récupérés depuis OpenStreetMap, il nous aurait fallu parser nous même le Xml et implémenter des classes contenant les résultats.
Par ailleurs, il n'existe que très peu de tutoriaux détaillés permettant d'implémenter des fonctionnalités grâce a OpenStreetMap.
Etant donné que cela représentait une quantité de travail importante sans pour autant nous offrir plus de possibilités pour l'application, nous avons choisis après quelques semaines d'utiliser les librairies Google. Notre envie de découvrir OpenStreetMap nous a au final fais perdre du temps que nous aurions pu passer à implémenter l'application.
En l'occurence, l'API Google Place définit des dizaines de types de batiments, et il existe des services web que l'on peut interroger via des requetes Web, avec les paramètres de recherche dans l'URL.

\section*{Google Place}
\paragraph{}
Parmi les nombreuses fonctionnalités que propose le géant de l'internet, une en particulière a retenu notre attention, une librairie permettant de récupérer les informations des lieux, Google Place API. Cette dernier nous permet de consulter, comme sur les applications maps du même groupe, les caractéristiques des lieux enregistrés dans leur base de données.

\section*{Comment cela fonctionne-t-il ?}
\paragraph{}
Le principe de l'API de d'envoyer des requêtes http au serveur afin de recevoir les points d'intérêts demandés.

\subsection*{les différents requêtes}
\paragraph{}
Nous utilisons quatres types de requêtes pour ce service.

\subsubsection*{Les recherches de proximité}
\paragraph{}
La recherche de proximité permet la récupération de tous points d'intérêts (cinéma,banque ...) dans un rayon maximal de 50km autour de la position de l'utilisateur.

\subsubsection*{Les recherches par texte}
\paragraph{}
Cette partie permet a l'utilisateur de recherche un lieu a partir du texte entrée.
Par exemple, s'il saisit « \textbf{Pizza Orléans} », il retournera les lieux en rapport avec pizza et Orléans.

\subsubsection*{La demande de détails}
\paragraph{}
Cette requête est très utile car par défaut, nous récupérons un lieu vraiment basique (nom, adresse, etc). Elle nous permet de compléter le lieu avec des informations complémentaires qui vont du site internet jusqu'aux commentaires ajouté par les utilisateurs de Google en passant par les horaires d'ouverture.
Dans notre cas nous utilisons que des informations simple comme le site web.

\subsubsection*{La récupération de photo}
\paragraph{}
Cette derniere permet de récupérer via une référence, une url poitant vers la photo d'un lieu.

\subsection*{Les résultats obtenus}
\paragraph{}
L'usage de cette librairie nous renvoi les données au format JSON. Afin de les rendre utilisable, le résultat est directement transformer en classe par le biais d'un parseur. Celui-ci est créer lors de la génération du transporteur HTTP dans la classe FouilleDonnee.

\subsection*{Le code}
\paragraph{}
Comme tous service de Google l'exige, il a fallu enregistrer le projet afin d'obtenir une clé nous autorisant à se connecter aux serveurs. La norme Android spécifie d'utiliser cette classe dans une classe asynchrone.
\clearpage
\subsubsection*{Les requêtes}
\paragraph{}
Voici une des requêtes concernant la récupération de point d'intérêts
\\
\end{onehalfspace}
\begin{lstlisting}
	public ListeLieu getLieuProximiteParType(double lat,double lng,ArrayList<String> types,int distance) {
		try {

			HttpRequestFactory httpRequestFactory = createRequestFactory(HTTP_TRANSPORT);
			HttpRequest request = httpRequestFactory
					.buildGetRequest(new GenericUrl(PLACES_SEARCH_URL));


			request.getUrl().put("location", lat + "," + lng);
			request.getUrl().put("radius", distance); // in meters

			if(types != null && types.size()>0) {
				types=FrancaisToApi(types);
				request.getUrl().put("types", typesFormatUrl(types));
			}
		
			completePlaceQuery(request.getUrl());
			Log.d("url",request.getUrl().toString());
			ListeLieu list = request.execute().parseAs(ListeLieu.class);
			return list;

		} catch (HttpResponseException e) {
            Log.e("Error:", e.getMessage());
        } catch (IOException e) {
			e.printStackTrace();
		//} catch (InterruptedException e) {
			//e.printStackTrace();
        } 
		return null;
	}
\end{lstlisting}
\begin{onehalfspace}
\subsubsection*{Lieu}
\paragraph{}
Sur chaque membre de la classe nous ajoutons l'annotation @Key afin que le parseur remplisse chaque champs de la classe avec le code JSON. Afin de filtrer les informations dont nous n'avons pas besoin, comme les commentaires d'utilisateurs de Google, il suffit de ne pas mettre de champs correspondant.
\\
\end{onehalfspace}
\begin{lstlisting}
//Il faut que cette classe soit serializable pour appliquer le writeObject() dessus
public class Lieu implements Serializable{

	private static final long serialVersionUID = 1L;

	public Lieu(){
	}
	/**
	 * L utilisateur veut enregistrer sa position actuelle comme favoris
	 * Il saisis certains champs seulement, et l'id n'est pas connu
	 * @param name
	 * @param reference
	 * @param icon
	 * @param vicinity
	 * @param geometry
	 * @param formatted_address
	 */
	public Lieu(String name, List<String> types , String reference, String icon, String vicinity, Geometry geometry, String formatted_address,String phoneNumer,String website){
		id="";
		this.types = types;
		this.name=name;
		this.reference=reference;
		this.icon=icon;
		this.vicinity=vicinity;
		this.geometry=geometry;
		this.formatted_address=formatted_address;
		this.formatted_phone_number = phoneNumer;
		this.website = website;
	}

	@Key	
	public String id;
	@Key
	public String name;
	@Key
	public String reference;
	@Key
	public String icon;
	@Key
	public String vicinity;
	@Key
	public Geometry geometry;
	@Key
	public String formatted_address;
	@Key 
	public List<Photo> photos;
	@Key
	public List<String> types;
	/** DETAILS */
	@Key
	public String formatted_phone_number;
	@Key
	public String website;
	@Override
	public String toString() {
		return id+" "+name+" "+icon;
	}

	public static class Geometry implements Serializable
	{
		private static final long serialVersionUID = -1846546423355113268L;
		@Key
		public MyLocation location;
		
		public Geometry(){	
		}
		
		public Geometry(MyLocation location){
			this.location=location;
		}
	}

	public static class MyLocation implements Serializable
	{
		private static final long serialVersionUID = -745398283024148157L;
		
		@Key
		public double lat;
		@Key
		public double lng;
		
		public MyLocation(){	
		}
		
		public MyLocation(double lat, double lng){
			this.lat=lat;
			this.lng=lng;
		}
	}

	public double getLatitude() {
		return geometry.location.lat;
	}

	public double getLongitude() {
		return geometry.location.lng;
	}

	@Override
	public boolean equals(Object o) {
		Lieu l = (Lieu)o;
		return this.name==l.getNom();
	}
}
\end{lstlisting}
\begin{onehalfspace}
\subsubsection*{ListeLieu}
\paragraph{}
Cette classe correspondant à la racine du JSON, le status nous permet de savoir comment la requête s'est déroulée, \textbf{next\_page\_token} permet d'avoir acccès au 20 résultats suivants dans une limite de 60 par requêtes et la liste de Lieu contient tous les lieux que la requête a demandée.
\\
\end{onehalfspace}
\begin{lstlisting}
public class ListeLieu implements Serializable {
 
    private static final long serialVersionUID = -1467727864221797449L;

    @Key
    public String status;
	
    @Key
    public String next_page_token;
 
    @Key
    public List<Lieu> results;
 
}
\end{lstlisting}
\begin{onehalfspace}
\subsubsection*{PlaceDetails}
\paragraph{}
Cette classe, comme ListeLieu correspondant a la racine du retour de notre requête concernant la demande de détails sur un lieu, elle contient un lieu et le status de la requête.


\paragraph{}
Ces classes forment la liaison entre notre application et les serveurs de Google. Mais existe-t-il d'autres hébergeurs pour ce type de services ?

\section*{Et pourquoi pas quitter Google ?}
\paragraph{}
Les plateformes à Google étant gratuites et mondialement connues, ils doivent donc limiter les usages de leurs services, alors autres que récupérer toutes vos informations, ce dernier bride le nombre de requêtes pour chaque services, dans notre cas nous atteignons la barre de 1000 requêtes par jour, ridicule. 
\paragraph{}
Il nous est possible de dépasser cette limitation mais tout en restant « gratuit » par l'enregistrement d'une carte bancaire, impensable pour nous. De ce faite, vous pensions à nouveau migrer vers un autre hébergeur pour ce service.
\paragraph{}
En effet, il existe \emph{FourSquare} ou \emph{Yahoo GeoPlanet}, qui propose les mêmes fonctionnalités. Si l'envie en prenait aux développeurs de migrer vers ces plateformes, il ne suffirait que de modifier les fonctions associés aux requêtes afin de se désenchaîner de ce géant.
